home *** CD-ROM | disk | FTP | other *** search
/ Inter.Net 55-1 / Inter.Net 55-1.iso / beos / PPBeDevKit.ZIP / PLAYERPR.TAR / PlayerPRO / Source / TickRemover.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-12-26  |  5.4 KB  |  173 lines

  1. /********************                        ***********************/
  2. //
  3. //    Player PRO 5.0 - DRIVER SOURCE CODE -
  4. //
  5. //    Library Version 5.0
  6. //
  7. //    To use with MAD Library for Mac: Symantec, CodeWarrior and MPW
  8. //
  9. //    Antoine ROSSET
  10. //    16 Tranchees
  11. //    1206 GENEVA
  12. //    SWITZERLAND
  13. //
  14. //    COPYRIGHT ANTOINE ROSSET 1996, 1997, 1998
  15. //
  16. //    Thank you for your interest in PlayerPRO !
  17. //
  18. //    FAX:                (+41 22) 346 11 97
  19. //    PHONE:             (+41 79) 203 74 62
  20. //    Internet:     RossetAntoine@bluewin.ch
  21. //
  22. /********************                        ***********************/
  23.  
  24. #include "RDriver.h"
  25. #include "RDriverInt.h"
  26.  
  27. void MADTickLoopFill8( Channel *curVoice, long *ASCBuffer1, long *ASCBuffer2, long size, short left, short right)
  28. {
  29.     size++;
  30.     while( size-- > 0)
  31.     {
  32.         *ASCBuffer1 += left;        ASCBuffer1 += 2;
  33.         *ASCBuffer2 += right;        ASCBuffer2 += 2;
  34.     }
  35.     curVoice->prevPtr = 0L;
  36. }
  37.  
  38. void MADTickLoop8( long size, Channel *curVoice, long *ASCBuffer1, long *ASCBuffer2, MADDriverRec *intDriver)
  39. {
  40.     long        tLongL, tLongR;
  41.     long        curLevelL = curVoice->curLevelL, curLevelR = curVoice->curLevelR, curLastWordL = curVoice->curLastWordL, curLastWordR = curVoice->curLastWordR, TICKREMOVESIZE = curVoice->TICKREMOVESIZE;
  42.     Boolean    LevelDirectionL = curVoice->LevelDirectionL, LevelDirectionR = curVoice->LevelDirectionR, RemoverWorking = curVoice->RemoverWorking;
  43.     
  44.     if( TICKREMOVESIZE == 0) return;
  45.     
  46.     while( size-- > 0)
  47.     {
  48.         if( LevelDirectionL)
  49.         {
  50.             if( curLevelL > 0) curLevelL--;            else RemoverWorking = false;
  51.             tLongL = (curLastWordL * curLevelL) / TICKREMOVESIZE;
  52.         }
  53.         else
  54.         {
  55.             if( curLevelL < TICKREMOVESIZE) curLevelL++;    else RemoverWorking = false;
  56.             tLongL = (curLastWordL * curLevelL) / TICKREMOVESIZE;
  57.             tLongL -= curLastWordL;
  58.         }
  59.         
  60.         if( curVoice->LevelDirectionR)
  61.         {
  62.             if( curLevelR > 0) curLevelR--;            else RemoverWorking = false;
  63.             tLongR = (curLastWordR * curLevelR) / TICKREMOVESIZE;
  64.         }
  65.         else
  66.         {
  67.             if( curLevelR < TICKREMOVESIZE) curLevelR++;            else RemoverWorking = false;
  68.             tLongR = (curLastWordR * curLevelR) / TICKREMOVESIZE;
  69.             tLongR -= curLastWordR;
  70.         }
  71.         
  72.         //    Double ASCBUFFER
  73.         *ASCBuffer1 += tLongL;    ASCBuffer1 += 2;
  74.         *ASCBuffer2 += tLongR;    ASCBuffer2 += 2;
  75.     }
  76.     
  77.     curVoice->curLevelL = curLevelL;
  78.     curVoice->curLevelR = curLevelR;
  79.     curVoice->curLastWordL = curLastWordL;
  80.     curVoice->curLastWordR = curLastWordR;
  81.     curVoice->TICKREMOVESIZE = TICKREMOVESIZE;
  82.     curVoice->LevelDirectionL = LevelDirectionL;
  83.     curVoice->LevelDirectionR = LevelDirectionR;
  84.     curVoice->RemoverWorking = RemoverWorking;
  85. }
  86.  
  87. void MADTickRemoverStart8( Channel *curVoice, long    *ASCBuffer1, long    *ASCBuffer2, MADDriverRec *intDriver)
  88. {
  89.     long                i = intDriver->ASCBUFFER;
  90.     long                curDoVol0 = DoVolPanning256( 0, curVoice, intDriver), curDoVol1 = DoVolPanning256( 1, curVoice, intDriver);
  91.     
  92.     if(    curVoice->prevPtr    != curVoice->begPtr ||
  93.             (curVoice->curPtr    >= curVoice->maxPtr && curVoice->loopSize == 0) ||
  94.             curVoice->prevVol0     != curDoVol0 ||
  95.             curVoice->prevVol1     != curDoVol1)
  96.     {
  97.         Boolean    DoIT = false;
  98.         
  99.         curVoice->LevelDirectionL = true;
  100.         curVoice->LevelDirectionR = true;
  101.         
  102.         // Right Channel
  103.         if( curVoice->prevVol0 != curDoVol0 && curVoice->prevPtr    == curVoice->begPtr)
  104.         {
  105.             long diff = curVoice->prevVol0 - curDoVol0;
  106.             
  107.             if( diff > 0)
  108.             {
  109.                 if( curVoice->prevVol0 != 0) curVoice->lastWordR -= (curVoice->lastWordR * curDoVol0) / curVoice->prevVol0;
  110.                 curVoice->prevVol0    = curDoVol0;
  111.                 DoIT = true;
  112.             }
  113.             else if( diff < 0)
  114.             {
  115.                 if( curVoice->prevVol0 != 0) curVoice->lastWordR -= (curVoice->lastWordR * curDoVol0) / curVoice->prevVol0;
  116.                 curVoice->lastWordR = -curVoice->lastWordR;
  117.                 curVoice->prevVol0    = curDoVol0;
  118.                 curVoice->LevelDirectionR = false;
  119.                 DoIT = true;
  120.             }
  121.         }
  122.         else if( curVoice->prevPtr    == curVoice->begPtr) curVoice->lastWordR = 0;
  123.         
  124.         // Left Channel
  125.         if( curVoice->prevVol1 != curDoVol1 && curVoice->prevPtr    == curVoice->begPtr)
  126.         {
  127.             long diff = curVoice->prevVol1 - curDoVol1;
  128.             
  129.             if( diff > 0)
  130.             {
  131.                 if( curVoice->prevVol1 != 0) curVoice->lastWordL -= (curVoice->lastWordL * curDoVol1) / curVoice->prevVol1;
  132.                 curVoice->prevVol1    = curDoVol1;
  133.                 DoIT = true;
  134.             }
  135.             else if( diff < 0)
  136.             {
  137.                 if( curVoice->prevVol1 != 0) curVoice->lastWordL -= (curVoice->lastWordL * curDoVol1) / curVoice->prevVol1;
  138.                 curVoice->lastWordL = -curVoice->lastWordL;
  139.                 curVoice->prevVol1    = curDoVol1;
  140.                 curVoice->LevelDirectionL = false;
  141.                 DoIT = true;
  142.             }
  143.         }
  144.         else if( curVoice->prevPtr    == curVoice->begPtr) curVoice->lastWordL = 0;
  145.         
  146.         if( curVoice->lastWordL != 0 || curVoice->lastWordR != 0 || DoIT == true)
  147.         {
  148.             curVoice->TICKREMOVESIZE         = intDriver->VSYNC;
  149.             curVoice->TICKREMOVESIZE         /= intDriver->finespeed;
  150.             curVoice->TICKREMOVESIZE         *= 80L;
  151.             curVoice->TICKREMOVESIZE         /= intDriver->VExt;
  152.             
  153.             if( curVoice->LevelDirectionR) curVoice->curLevelR        = curVoice->TICKREMOVESIZE;
  154.             else curVoice->curLevelR        = 0;
  155.             
  156.             if( curVoice->LevelDirectionL) curVoice->curLevelL        = curVoice->TICKREMOVESIZE;
  157.             else curVoice->curLevelL        = 0;
  158.             
  159.             curVoice->curLastWordR        = curVoice->lastWordR;
  160.             curVoice->curLastWordL        = curVoice->lastWordL;
  161.             curVoice->lastWordR                = 0;
  162.             curVoice->lastWordL                = 0;
  163.             
  164.             curVoice->RemoverWorking = true;
  165.         }
  166.         
  167.         curVoice->prevPtr            = curVoice->begPtr;
  168.         curVoice->prevVol0        = curDoVol0;
  169.         curVoice->prevVol1        = curDoVol1;
  170.     }
  171.     
  172.     if( curVoice->RemoverWorking) MADTickLoop8( i, curVoice, ASCBuffer1, ASCBuffer2, intDriver);
  173. }